package cn.jingyuan.bee.utils.lang;

import cn.jingyuan.bee.utils.lang.mutable.MutableObject;

/**
 * 为不可变的对象引用提供一个可变的包装，在 java 中支持引用传递。
 *
 * @param <T> 所持有值类型
 */
public final class Holder<T> extends MutableObject<T> {

    /**
     * 构造
     */
    public Holder() {
        super();
    }

    /**
     * 构造
     *
     * @param value 被包装的对象
     */
    public Holder(T value) {
        super(value);
    }

    /**
     * 新建 Holder 类，持有指定值，当值为空时抛出空指针异常
     *
     * @param <T> 被持有的对象类型
     * @param value 值，不能为空
     *
     * @return Holder
     */
    public static <T> Holder<T> of(T value) throws NullPointerException {
        if (null == value) {
            throw new NullPointerException("Holder can not hold a null value!");
        }
        return new Holder<>(value);
    }

}
